home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
buff.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-04
|
12KB
|
498 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
static UBYTE l[VERY_LONG_LINE], s[VERY_LONG_LINE], w[VERY_LONG_LINE]; /* 十分なエリア */
/* フラグ=1で、最初に情報を付けてセーブする */
/* h から last の前の行までをセーブする */
/* fn が NULL ならば、カレントの名前で、さもなくば fn の名前でセーブする */
int
buff_save_file(int flag,UNIT *h,UNIT *last,STR fn)
{
register UNIT *wp;
register UBYTE *p,*q;
register UBYTE c;
register FILE *fp;
int writeline = 0;
UBYTE s[VERY_LONG_LINE * 4];
UBYTE d[VERY_LONG_LINE * 4];
UBYTE fname[MAXLINE];
UBYTE tname[MAXLINE];
FILE *fpb;
if (fn) { /* 指定があるなら */
strcpy(fname,fn); /* それ */
} else { /* さもなくば */
strcpy(fname,FILE_NAMES[WDATA[CWN].WTEXTS].CONTENT); /* カレントの名前を得る */
}
etc_get_tname(tname,fname);
if (!*tname) {
return(0);
}
under_print((STR)"[書き出し中...]");
if (!(fp = fopen((char *)tname,"wb"))) {
error("ファイルの書き込みオープンが出来ません");
return(0);
}
if (flag) {
fprintf(fp,"[This is a ThunderWord Text]\x0d\x0a");
fprintf(fp,"[WIDTH=%d]\x0d\x0a",CURRENT_JIZUME);
fprintf(fp,"[LWIDTH=%d]\x0d\x0a",(!!LYW_UPPER)+(!!LYW_UNDER)*2);
fprintf(fp,"[PAGE=%d]\x0d\x0a",PAGE);
fprintf(fp,"[CR=%d]\x0d\x0a",CR_VIEW); /* 改行を表示するか */
fprintf(fp,"[TAB=%d,%d]\x0d\x0a",TAB_LENGTH,TAB_VIEW); /* タブの長さと、表示 */
if (sysflag & 0b1) {
fprintf(fp,"[HGAP=%d]\x0d\x0a",PRN_H_PITCH); /* 横ギャップ */
fprintf(fp,"[VGAP=%d]\x0d\x0a",PRN_V_PITCH); /* 縦ギャップ */
fprintf(fp,"[LEFT_MARGIN=%d]\x0d\x0a",PRN_LEFT_MARGIN); /* 左マージン */
fprintf(fp,"[UP_MARGIN=%d]\x0d\x0a",PRN_UP_MARGIN); /* 上マージン */
}
#if 0
fprintf(fp,"[BAK=%d]\x0d\x0a",CURRENT_BAK); /* ~.BAK を作るのか? */
fprintf(fp,"[MODE=%s]\x0d\x0a",(CMDMOD)?"ED":"ME"); /* モード */
#endif
fprintf(fp,"[ThunderWord Control End]\x0d\x0a");
}
if (h) {
wp = h;
} else {
wp = HEAD->ATO; /* 最初の一行 */
}
if (!last) {
last = TAIL;
}
while(wp != last) {
p = s;
line_get_body(s,wp); /* s がバッファの実体 */
q = d; /* d が掃除後のバッファの実体 */
while(c = *p++) {
if (c == XCODE_UP) {
register UBYTE c0;
c0 = *p++; /* 次の1バイト */
switch(c0) {
case XCODE_MARK+0:
case XCODE_MARK+1:
case XCODE_MARK+2:
case XCODE_MARK+3:
case XCODE_MARK+4:
case XCODE_MARK+5:
case XCODE_MARK+6:
case XCODE_MARK+7:
case XCODE_MARK+8:
case XCODE_MARK+9: /* マーク 0x20 - 0x29 */
case XCODE_MARK+10:
case XCODE_MARK+11:
case XCODE_MARK+12:
case XCODE_MARK+13:
case XCODE_MARK+14:
case XCODE_MARK+15:
case XCODE_SYSMARK+0: /* システムマーク */
case XCODE_SYSMARK+1:
case XCODE_SYSMARK+2:
case XCODE_SYSMARK+3:
case XCODE_SYSMARK+4:
case XCODE_SYSMARK+5:
case XCODE_SYSMARK+6:
case XCODE_SYSMARK+7:
case XCODE_SYSMARK+8:
case XCODE_SYSMARK+9:
case XCODE_SYSMARK+10:
case XCODE_SYSMARK+11:
case XCODE_SYSMARK+12:
case XCODE_SYSMARK+13:
case XCODE_SYSMARK+14:
case XCODE_SYSMARK+15:
break; /* マークは捨てる */
case XCODE_UL: /* 下線 */
*q++ = c;
*q++ = c0;
break; /* 下線は書き込む */
case XCODE_RB10: /* 予約:1文字真ん中ルビ */
case XCODE_RB1: /* 1文字ルビ */
case XCODE_RB1L: /* 1文字ルビ左(全角用) */
case XCODE_RB1R: /* 1文字ルビ右(全角用) */
*q++ = c;
*q++ = c0;
*q++ = *p++;
*q++ = *p++;
break; /* ルビであるから、2バイト文字 */
case XCODE_RB2: /* 2文字ルビ(全角用) */
*q++ = c;
*q++ = c0;
*q++ = *p++;
*q++ = *p++;
*q++ = *p++;
*q++ = *p++;
break; /* ルビであるから、2バイト文字 */
}
} else {
*q++ = c;
}
}
if ((q != d) && (q[-1] == CR)) {
q[-1] = (UBYTE) '\x0d';
*q++ = (UBYTE) '\x0a';
}
*q = EOS;
writeline++;
if (fputs((char *)d,fp)) {
error("ファイル書き込みに失敗しました");
return(0);
}
wp = wp->ATO;
}
if (fflush(fp)) {
error("ファイル書き込みに失敗しました");
return(0);
}
fclose(fp);
if (CURRENT_BAK) { /* ~.BAK を作るのか? */
UBYTE backname[MAXLINE];
etc_get_pathname_bak(backname,fname); /* 名前を得る */
if (fpb = fopen((char *)backname,"rb")) { /* 存在するか */
fclose(fpb); /* クローズする */
if (fdelete(backname)) { /* バックアップファイルを削除する */
/* 削除できない! エラーは無視 */
if (fdelete(fname)) { /* オリジナルを削除する */
/* 削除出来ない! 暫定名で終了 */
UBYTE w[MAXLINE];
sprintf((char *) w,
"[ %s に %d 行をセーブしました]",tname,writeline);
under_print(w);
return(0);
}
} else { /* 削除出来た */
if (frename(fname,backname)) { /* オリジナルを~.BAKに改名する */
/* 改名出来ない! 暫定名で終了 */
UBYTE w[MAXLINE];
sprintf((char *) w,
"[ %s に %d 行をセーブしました]",tname,writeline);
under_print(w);
return(0);
} else { /* 暫定ファイルをリネームする */
if (frename(tname,fname)) {
error("ファイルの名前変更に失敗しました");
return(0);
}
}
}
} else {
/* ~.BAKは最初から存在しなかった */
if (fpb = fopen((char *)fname,"rb")) { /* オリジナルが存在するか */
fclose(fpb); /* クローズする */
if (frename(fname,backname)) { /* オリジナルを~.BAKに改名する */
/* 改名できない! */
UBYTE w[MAXLINE];
sprintf((char *) w,
"[ %s に %d 行をセーブしました]",tname,writeline);
under_print(w);
return(0);
}
}
if (frename(tname,fname)) {
error("ファイルの名前変更に失敗しました");
return(0);
}
}
} else { /* BAK 作らないモード */
if (fpb = fopen((char *)fname,"rb")) { /* オリジナルが存在するか */
fclose(fpb); /* クローズする */
if (fdelete(fname)) {
/* 削除出来ない! */
UBYTE w[MAXLINE];
sprintf((char *) w,"[ %s に %d 行をセーブしました]",tname,writeline);
under_print(w);
return(0);
} else { /* 削除出来た */
if (frename(tname,fname)) {
error("ファイルの名前変更に失敗しました");
return(0);
}
}
} else {
if (frename(tname,fname)) {
error("ファイルの名前変更に失敗しました");
return(0);
}
}
}
{
UBYTE w[MAXLINE];
sprintf((char *) w,"[ %d 行]",writeline);
under_print(w);
}
return(1);
}
void
buff_read_file_x(int tn)
{
UBYTE s[MAXLINE];
if (tn == CURRENT_TEXT) {
buff_read_file();
} else {
FILE *fp;
UBYTE s[MAXLINE];
*s = EOS; /* 前からの繰り越しはなし */
fp = FILE_POINTERS[tn];
if (!fp) { /* 実物がない */
buff_read_file_new_x(tn);
} else { /* 実物がある */
/* init_skip_cnf(fp,s);*/
init_by_cnf_or_default_tn(fp,s,tn);
buff_read_file_ins(fp,s,&TDATA[tn].TEXT_TAILS);
}
}
}
/* テキストの初期化だけする */
UNIT *
buff_read_file_new_x(int tn)
{
UNIT *p;
p = line_get_free_and_store((STR)"");
if (p == NIL) { /* フリーラインが無い! */
under_print0((STR)"メモリ不足:途中で中断します。他の文章をすぐ保存して下さい [Y]? ");
etc_wait_y();
return(&AXE);
/* etc_om_exit();*/
} else {
line_insert1_mae(p,&TDATA[tn].TEXT_TAILS);
}
return(p);
}
/* テキストの初期化だけする */
int
buff_read_file_new()
{
CL = buff_read_file_new_x(CURRENT_TEXT);
under_print((STR)"[ 新規ファイル ]");
disp_btm_line(CWN);
meta_left_blaket();
return(0);
}
/* ファイルの読み込み */
/* カレントバッファ(空)にカレントファイルを読み込む */
/* error = -1 */
int
buff_read_file()
{
FILE *fp;
CL = NIL;
*s = EOS; /* 前からの繰り越しはなし */
fp = FILE_POINTERS[CURRENT_TEXT];
if (!fp) {
buff_read_file_new();
init_get_default_tn(CURRENT_TEXT);
return(0);
}
init_by_cnf_or_default_tn(fp,s,CURRENT_TEXT);
under_print0((STR)"[ファイル読み込み中…]"); /* 時間の掛かる作業の時はメッセージを出す */
buff_read_file_ins(fp,s,TAIL);
fclose(fp);
under_blanc();
disp_btm_line(CWN);
meta_left_blaket();
return(0);
}
/* 先頭に s を付けてカレントテキストに挿入する */
/* 生成した行数を返す */
/* 挿入後、最後に改行が無く、しかも TAIL の前でなければ改行を付け加える */
int
buff_read_file_ins(FILE *fp,STR s,UNIT *cl)
{
register int lc=0;
register UINT jizume,jizume4;
register UINT jizume3;
UINT slen;
UNIT *p,*cl0;
cl0 = cl->MAE;
jizume = CURRENT_JIZUME;
/* jizume3 = jizume+3;*/
jizume4 = jizume+4;
do {
if (!*s) {
fgets((char *)s,jizume4,fp); /* s がヌルなら適当な長さだけ読み出す */
}
while(1) {
if (((slen = strlen(s)) >= 2) &&
(s[slen-1] == CR) && (s[slen-2] == '\x0d')) {
s[slen-2] = CR;
s[slen-1] = EOS;
break;
}
if (string_disp_len(s) > (jizume+6)) { /* 禁則はみだしがあるので長め */
break;
}
fgets((char *)l,jizume4,fp); /* 適当な長さだけ読み出す */
strcat(s,l); /* 前からの繰り越しの後に加える */
if (feof(fp)) break;
}
if ((cl == CL) && ((CL != NIL) && (!*s))) { /* feof に達した */
break;
}
cut_line(s,w,s,jizume);
p = line_get_free_and_store(w);
if (p == NIL) { /* フリーラインが無い! */
etc_beep();
under_print0((STR)"メモリ不足:途中で中断します。他の文章をすぐ保存して下さい [Y]? ");
etc_wait_y();
line_deleten(cl0,cl);
etc_beep();
under_print0((STR)"安全のため、読み込んだ文章を破棄しました [Y]? ");
etc_wait_y();
return(0);
/* etc_om_exit();*/
} else {
if ((cl == CL) && (CL == NIL)) {
CL = p; /* ポインタの初期化 */
}
line_insert1_mae(p,cl);
lc++;
}
} while((!feof(fp)) || (*s));
if ((etc_last(w) != CR) && (p->ATO != TAIL)) {
strcat(w,"\n");
line_store_and_echo(p,w);
}
etc_trim_tail();
return(lc);/* ,,, */
}
int
buff_ishan2byte(UBYTE c1)
{
return((c1 == (UBYTE)'\x80') || ((c1 >= (UBYTE)'\xf0') && (c1 < (UBYTE) XCODE_UP)));
}
/* カットバッファに文字列を送り込む */
/* マークコードは取り除く */
/* 文字列の中にマークコードがあったなら対応するビットを立てて返す */
/* 32ビットだよーん */
UINT
buff_add_to_cut_buff(STR s)
{
UINT mask = 0;
STR p0;
register STR p;
p0 = p = s;
mask = mark_find_mark(s);
if (mask) { /* マークを取り除かなければいけない */
UBYTE w[VERY_LONG_LINE];
register STR pw;
p = s;
pw = w;
while(*p) {
if ((*pw++ = *p++) == XCODE_UP) {
if ((XCODE_MARK <= *p) && (*p <= (XCODE_MARKLAST))) {
/* マークだ! */
mask |= (1 << (*p - XCODE_MARK));
pw--;
p++;
}
}
}
*pw = EOS;
p0 = w;
}
line_append_cut_buff_list(p0);
return(mask);
}
/* カットバッファから文字列を取り出す */
/* 指定されたユニット番号から、指定されたバイト数を渡す */
/* l == 0 だと、最初の一行を無条件に渡す */
/* 何ユニット目を渡したかを返す。-1なら何も渡せない */
int
buff_get_from_cut_buff(STR s,int l,int begin)
{
UNIT *wp,*wp0;
UBYTE w[VERY_LONG_LINE];
UINT len = 0;
int i;
*s = EOS;
wp = CUT_BUFF_HEAD;
for(i = 0;i < begin;i++) {
if (wp == NIL) return(-1); /* 最初のユニットに達する前に終わった */
wp = wp->ATO;
}
if (wp == NIL) return(-1); /* 最初のユニットに達する前に終わった */
while(wp) {
line_get_body(w,wp);
strcat(s,w); /* 追加する */
len += wp->LENGTH;
if ((wp = wp->ATO) == NIL) {
break;
}
if (len < l) { /* まだ足りない */
i++;
continue; /* 続行 */
} else { /* ちょうどもしくは長い */
break; /* 拡張コードなどの関係があるのでこうなってる */
}
}
return(i);
}
UNIT *
line_append_cut_buff_list(UBYTE *s)
{
UNIT *p;
if (!(p = line_get_free_and_store(s))) return(NIL);
if (CUT_BUFF_HEAD) { /* 袋リストがある */
CUT_BUFF_TAIL->ATO = p; /* 最後の次が手持ちになる */
p->MAE = CUT_BUFF_TAIL; /* 手持ちの前は最後 */
p->ATO = NIL; /* 新しい最後は NIL を指す */
CUT_BUFF_TAIL = p; /* 新しい最後を指す */
} else { /* フリーラインがない */
CUT_BUFF_HEAD = CUT_BUFF_TAIL = p;
p->MAE = p->ATO = NIL;
}
return(p);
}
void
buff_clear_cut_buff()
{
line_deleten_list(CUT_BUFF_HEAD,CUT_BUFF_TAIL);
CUT_BUFF_HEAD = CUT_BUFF_TAIL = NIL;
line_deleten_list(CUT_BUFF_HEAD0,CUT_BUFF_TAIL0);
CUT_BUFF_HEAD0 = CUT_BUFF_TAIL0 = NIL;
}